﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Cotizav.CONTROLADOR;

namespace Cotizav.PRESENTACION.Otros
{
    public partial class IngresoMasivo : Form
    {
        CtrlImportar ctImportar;
        Dictionary<int, string> listaAtributos;        

        public IngresoMasivo()
        {
            InitializeComponent();

            ctImportar = new CtrlImportar();

            listaAtributos = new Dictionary<int, string>();
        }

        private void IngresoMasivo_Load(object sender, EventArgs e)
        {
            cmbObjetoImportar.DataSource = ctImportar.obtenerNombreTablas();
            cmbObjetoImportar.SelectedIndex = -1;
        }

        private void btnExaminar_Click(object sender, EventArgs e)
        {
            OpenFileDialog openDialog = new OpenFileDialog();
            openDialog.Filter = "Documento Excel 2003 (.xls)|*.xls|Documento Excel 2007 y posterior (.xlsx)|*.xlsx";
            openDialog.FilterIndex = 2;

            if (openDialog.ShowDialog(this) == DialogResult.OK)
            {
                txtRutaArchivo.Text = openDialog.FileName;                
            }

            txtNumColumnas.ResetText();
            txtNumFilas.ResetText();
        }

        private void btnCargarArchivo_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrWhiteSpace(txtRutaArchivo.Text))
            {
                bool tieneEncabezado = chkTieneEncabezado.Checked ? true : false;
                
                DataTable result = ctImportar.importarArchivo(txtRutaArchivo.Text, tieneEncabezado);

                gridVistaPrevia.DataSource = result;

                //colocamos la informacion del DataTable
                txtNumColumnas.Text = gridVistaPrevia.Columns.Count.ToString();
                txtNumFilas.Text = gridVistaPrevia.Rows.Count.ToString();
            }
        }

        private void cmbObjetoImportar_SelectionChangeCommitted(object sender, EventArgs e)
        {
            if (gridVistaPrevia.DataSource != null)
            {
                if (cmbObjetoImportar.SelectedIndex >= 0)
                {
                    string objectName = cmbObjetoImportar.SelectedItem.ToString();

                    gridRelacion.Rows.Clear();

                    listaAtributos = ctImportar.obtenerListaAtributos(objectName);
                    List<string> listaColumnas = new List<string>();

                    foreach (DataGridViewColumn dc in gridVistaPrevia.Columns)
                    {
                        listaColumnas.Add(dc.HeaderText);
                    }

                    ColumnaObjeto.DataSource = listaAtributos.Values.ToList();

                    foreach (string nameColumna in listaColumnas)
                    {
                        DataGridViewRow newRow = new DataGridViewRow();
                        newRow.CreateCells(gridRelacion);

                        newRow.Cells[0].Value = nameColumna;
                        gridRelacion.Rows.Add(newRow);
                    }
                }
            }
            else
            {
                MessageBox.Show("Seleccione el archivo para luego especificar la relación de columnas con los atributos del objeto del sistema", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                cmbObjetoImportar.SelectedIndex = -1;
            }
        }

        private void gridRelacion_CurrentCellDirtyStateChanged(object sender, EventArgs e)
        {
            if (gridRelacion.IsCurrentCellDirty)
            {
                gridRelacion.CommitEdit(DataGridViewDataErrorContexts.Commit);
            }
        }

        private void gridRelacion_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (gridRelacion.Columns[e.ColumnIndex].Name == "ColumnaObjeto")
            {
                string selectedValue = gridRelacion[e.ColumnIndex, e.RowIndex].Value.ToString();
                bool modificarColumna = true;

                foreach (DataGridViewRow dr in gridRelacion.Rows)
                {
                    if (dr.Index != e.RowIndex)
                    {
                        if (dr.Cells[e.ColumnIndex].Value != null)
                        {
                            if (selectedValue == dr.Cells[e.ColumnIndex].Value.ToString())
                            {
                                MessageBox.Show("El atributo elegido ya se encuentra en la fila " + (dr.Index + 1) + ".\nSeleccione otro atributo que no haya sido elegido", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                                //DataGridViewComboBoxCell selectedCell = gridRelacion[e.ColumnIndex, e.RowIndex] as DataGridViewComboBoxCell;                                
                                modificarColumna = false;
                                break;
                            } 
                        }
                    }
                }

                if (modificarColumna)
                {
                    int moveraIndice = listaAtributos.SingleOrDefault(x => x.Value == selectedValue).Key;
                    int indiceActual = e.RowIndex;
                    DataTable dtInformacion = gridVistaPrevia.DataSource as DataTable;
                    dtInformacion.Columns[indiceActual].SetOrdinal(moveraIndice);

                    gridVistaPrevia.DataSource = null;
                    gridVistaPrevia.DataSource = dtInformacion;
                }
            }
        }

        private void btnImportar_Click(object sender, EventArgs e)
        {
            if (listaAtributos.Count > 0 )
            {
                //deshabilitamos el grid para que no se pueda modificar durante el proceso
                gridRelacion.Enabled = false;

                DataTable dtInformacion = gridVistaPrevia.DataSource as DataTable;
                string nombreClase = cmbObjetoImportar.SelectedItem.ToString();

                ctImportar.cargarInformacion(nombreClase, dtInformacion);

                MessageBox.Show("Registros importados correctamente", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
            }

        }
    }
}
